package com.rui.adapter.main;

import com.rui.adapter.model.ClassPowerAdapter;
import com.rui.adapter.obj.AC220;
import com.rui.adapter.obj.AC360;
import com.rui.adapter.obj.Interface.DC;
import com.rui.adapter.obj.Interface.InterfacePowerAdapter;
import com.rui.adapter.obj.Object.DC5;
import com.rui.adapter.obj.Object.DC5PowerAdapter;

/**
 * 适配器模式（Adapter Class/Object）
 * <p>
 * 适配器模式，它的功能是将一个类的接口变成客户端所期望的另一种接口，从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作。
 * 适配器模式分为类适配器模式和对象适配器模式，前者类之间的耦合度比后者高，且要求程序员了解现有组件库中的相关组件的内部结构，所以应用相对较少些。
 * <p>
 * 适配器模式（Adapter）包含以下主要角色：
 * 目标（Target）接口：当前系统业务所期待的接口，它可以是抽象类或接口。
 * 适配者（Adaptee）类：它是被访问和适配的现存组件库中的组件接口。
 * 适配器（Adapter）类：它是一个转换器，通过继承或引用适配者的对象，把适配者接口转换成目标接口，让客户按目标接口的格式访问适配者。
 * <p>
 * <p>
 * 适用场景：
 * 已经存在的类，它的方法和需求不匹配（方法结构相同或相似）的情况。
 * 使用第三方提供的组件，但组件接口定义和自己要求的接口定义不同。
 * <p>
 * 优点：
 * 能提高类的透明性和复用，现有的类复用但不需要改变。
 * 目标类和适配器类解耦，提高程序的扩展性。
 * 在很多业务场景中符合开闭原则。
 * <p>
 * 缺点：
 * 适配器编写过程需要全面考虑，可能会增加系统的复杂性。
 * 增加代码阅读难度，降级代码可读性，过多使用适配器会使系统代码变得凌乱。
 *
 * @Author: ZhangRui
 * @Date: 2023/3/2 16:18
 * @Version: 1.0
 */
public class AdapterMain {

    public static void main(String[] args) {

        System.out.println("----------类适配器------------");
        ClassPowerAdapter classPowerAdapter = new ClassPowerAdapter();
        classPowerAdapter.output();
        classPowerAdapter.output5();

        System.out.println("----------对象适配器------------");
        DC5 dc5 = new DC5PowerAdapter(new AC220());
        System.out.println(dc5.output5());

        dc5 = new DC5PowerAdapter(new AC360());
        System.out.println(dc5.output5());

        System.out.println("----------接口适配器------------");
        DC dc = new InterfacePowerAdapter(new AC220());
        System.out.println(dc.output5());
        System.out.println(dc.output12());
        System.out.println(dc.output30());

        dc = new InterfacePowerAdapter(new AC360());
        System.out.println(dc.output5());
        System.out.println(dc.output12());
        System.out.println(dc.output30());
    }
}
